﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasModelo.Factorias;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasDesktop.UILogic;
using GestorDeFlotasDesktop.UILogic.Helpers;
using GestorDeFlotasDesktop.AbmChofer;
using GestorDeFlotasDesktop.AbmAuto;

namespace GestorDeFlotasDesktop.Asignacion
{
    public partial class FormAsignacion : BaseForm
    {
        AbmAuto.frmListadoAuto listadoAuto;
        AbmChofer.frmListadoChofer listadoChofer;
        private Auto autoSeleccionado=null;
        private Chofer choferSeleccionado = null;

        public FormAsignacion()
        {
            InitializeComponent();
            

        }

        protected override void OnVisibleChanged(EventArgs e)
        {
            try
            {
                autoSeleccionado = null;
                choferSeleccionado = null;
                dgvAsignacion.SelectionChanged += new EventHandler(dgvAsignacion_SelectionChanged);
                base.OnVisibleChanged(e);
                this.CargarCombos();
                this.CargarAsignaciones();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        void dgvAsignacion_SelectionChanged(object sender, EventArgs e)
        {
            try
            {
                if (dgvAsignacion.SelectedRows.Count > 0)
                    btnBorrarAsignacion.Visible = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void CargarCombos()
        {
            cmbTurno.DisplayMember = "Text";
            cmbTurno.ValueMember = "Value";
            cmbTurno.Items.Add(new ComboBoxItem("Seleccione un Turno", null));
            List<Turno> turnos = Transaccion.Factoria<FactoriaTurno>().SelectTodosHabilitados();

            foreach (Turno c in turnos)
            {
                cmbTurno.Items.Add(new ComboBoxItem(c.Descripcion + " " + c.HoraInicio + "-" + c.HoraFin, c));
            }
            cmbTurno.SelectedIndex = 0;
        }

        private void CargarAsignaciones()
        {
            Chofer c = choferSeleccionado;
            Auto a = autoSeleccionado;
            Turno t = null;
            btnBorrarAsignacion.Visible = false;
            if (((ComboBoxItem)cmbTurno.SelectedItem) != null)
                t=(Turno)((ComboBoxItem)cmbTurno.SelectedItem).Value;
            List<ChoferXAuto> asignaciones = Transaccion.Factoria<FactoriaChoferXAuto>().SelectXFiltro(c,a,t,false);
            SetGridData(asignaciones);
        }

        private void GridCreation()
        {
            dgvAsignacion.Columns.Clear();
            dgvAsignacion.ReadOnly = true;
            dgvAsignacion.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dgvAsignacion.MultiSelect = false;
            dgvAsignacion.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("Id", "Id", false));
            dgvAsignacion.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("Marca", "Marca del Taxi"));
            dgvAsignacion.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("Modelo", "Modelo del Taxi"));
            dgvAsignacion.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("Patente", "Patente del Taxi"));
            dgvAsignacion.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("Apellido", "Apellido del Chofer"));
            dgvAsignacion.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("Nombre", "Nombre del Chofer"));
            dgvAsignacion.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("Turno", "Turno Asignado"));
            dgvAsignacion.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("Fecha", "Fecha Asignacion"));
            dgvAsignacion.Columns.Add(DataGridViewHelpers.CreateDataGridViewCheckBoxColumn("Habilitado", "Asignacion Habilitada"));
        }
        private void SetGridData(List<ChoferXAuto> asignaciones)
        {
            if (asignaciones != null && asignaciones.Count > 0)
            {
                GridCreation();

                dgvAsignacion.DataSource = asignaciones.ConvertAll<ChoferXAutoProxy>(delegate(ChoferXAuto chofer) { return new ChoferXAutoProxy(chofer); }); ;
                dgvAsignacion.Visible = true;
                lblNoItems.Visible = false;
                dgvAsignacion.Columns["Id"].Visible = false;
            }
            else
            {
                lblNoItems.Visible = true;
                dgvAsignacion.Visible = false;
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                this.CargarAsignaciones();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnAsignar_Click(object sender, EventArgs e)
        {
            try
            {
                if (autoSeleccionado == null || choferSeleccionado == null || ((ComboBoxItem)cmbTurno.SelectedItem).Value == null)
                {
                    MessageBox.Show("Debe seleccionar todos los campos para agregar una asignacion");
                    return;
                }

                if (!autoSeleccionado.Habilitado)
                {
                    MessageBox.Show("El auto " + autoSeleccionado.Marca + " " + autoSeleccionado.Modelo + " " + autoSeleccionado.Patente + " esta deshabilitado", "Asignacion Fallida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                if (!autoSeleccionado.Reloj.Habilitado)
                {
                    MessageBox.Show("El reloj " + autoSeleccionado.Reloj.NumeroDeSerie + " esta deshabilitado, no puede realizarse la asignacion.", "Asignacion Fallida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                if (!choferSeleccionado.Habilitado)
                {
                    MessageBox.Show("El chofer " + choferSeleccionado.Apellido + " " + choferSeleccionado.Nombre + " esta deshabilitado. no puede realizarse la asignacion", "Asignacion Fallida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                Turno turno = ((ComboBoxItem)cmbTurno.SelectedItem).Value as Turno;

                List<ChoferXAuto> asignacionesExistentes = Transaccion.Factoria<FactoriaChoferXAuto>().SelectXFiltro(choferSeleccionado, null, turno, true);
                if (asignacionesExistentes.Count > 0)
                {
                    MessageBox.Show("El chofer " + choferSeleccionado.Apellido + " " + choferSeleccionado.Nombre + " ya tiene una asignacion para el turno: " + turno.Descripcion, "Asignacion Fallida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                asignacionesExistentes = Transaccion.Factoria<FactoriaChoferXAuto>().SelectXFiltro(null, autoSeleccionado, ((ComboBoxItem)cmbTurno.SelectedItem).Value as Turno, true);
                if (asignacionesExistentes.Count > 0)
                {
                    MessageBox.Show("El auto " + autoSeleccionado.Marca + " " + autoSeleccionado.Modelo + " " + autoSeleccionado.Patente + " ya tiene una asignacion para el turno: " + turno.Descripcion, "Asignacion Fallida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                ChoferXAuto asignacion = Transaccion.Factoria<FactoriaChoferXAuto>().Nuevo(choferSeleccionado, autoSeleccionado, ((ComboBoxItem)cmbTurno.SelectedItem).Value as Turno);
                Transaccion.Persistir();
                MessageBox.Show("Se ha asignado correctamente el chofer.");
                this.CargarAsignaciones();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void btnBorrarFiltros_Click(object sender, EventArgs e)
        {
            try
            {
                this.txtAuto.Text = "";
                this.txtChofer.Text = "";
                autoSeleccionado = null;
                choferSeleccionado = null;
                this.CargarCombos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


      

        private void cmbTurno_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (chkBusquedaDinamica.Checked)
            this.CargarAsignaciones();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            listadoChofer = new frmListadoChofer(true, true);
            listadoChofer.ChoferSeleccionado += new EventHandler(abmChofer_choferSeleccionado);

            listadoChofer.Show();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            listadoAuto = new frmListadoAuto(FormMode.SelectItem);
            listadoAuto.AutoSeleccionado += new EventHandler(abmAuto_choferSeleccionado);
            listadoAuto.Show();
            
        }

        void abmChofer_choferSeleccionado(object s, object e)
        {
            this.choferSeleccionado = listadoChofer.ChoferElegido;

            txtChofer.Text = this.choferSeleccionado.Apellido + " " + this.choferSeleccionado.Nombre;
        }

        void abmAuto_choferSeleccionado(object s, object e)
        {
            this.autoSeleccionado = listadoAuto.AutoElegido;
           
            txtAuto.Text = this.autoSeleccionado.Marca + " " + this.autoSeleccionado.Modelo+" "+this.autoSeleccionado.Patente;
        }

        private void btnBorrarAsignacion_Click(object sender, EventArgs e)
        {
            if (dgvAsignacion.SelectedRows.Count == 0)
            {
                MessageBox.Show("Debe seleccionar una asignacion para eliminar.");
                return;
            }

            ChoferXAuto asignacionAEliminar=Transaccion.Factoria<FactoriaChoferXAuto>().SelectXId<ChoferXAuto>(((ChoferXAutoProxy)dgvAsignacion.SelectedRows[0].DataBoundItem).Id.ToString());
            Transaccion.Factoria<FactoriaChoferXAuto>().Eliminar(asignacionAEliminar);
            Transaccion.Persistir();
            MessageBox.Show("La asignacion ha sido eliminada correctamente.");
            this.CargarAsignaciones();
        } 

    }
}
